﻿<!DOCTYPE HTML>
<!-- saved from url=(0090)http://172.13.19.31:6060/note_html/服务器/CentOS/11012-shell-输入输出重定向、文件包含.html -->
<!DOCTYPE html PUBLIC "" ""><HTML><HEAD><META content="IE=11.0000" 
http-equiv="X-UA-Compatible">
 
<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<TITLE>shell-输入输出重定向、文件包含</TITLE> <LINK href="shell-输入输出重定向、文件包含_files/standalone.css" 
rel="stylesheet"> <LINK href="shell-输入输出重定向、文件包含_files/overlay-apple.css" rel="stylesheet"> 
<LINK href="shell-输入输出重定向、文件包含_files/article_edit.css" rel="stylesheet"> 
<STYLE type="text/css">
	#content{
		margin: 5px 10px;
	}
</STYLE>
	 <!-- 代码高亮 -->	 <LINK href="shell-输入输出重定向、文件包含_files/shCoreEclipse.css" rel="stylesheet">
	 <LINK href="shell-输入输出重定向、文件包含_files/my-highlighter.css" rel="stylesheet"> 
<META name="GENERATOR" content="MSHTML 11.00.10586.545"></HEAD> 
<BODY>
<DIV id="content">
<H1 align="center">shell-输入输出重定向、文件包含</H1>
<P align="right" 
style="margin: 0px 10px 0px 0px; padding: 0px;">最后修改时间：2015-09-04 14:47:28</P>
<HR style="border-width: 2px; border-color: lime;">

<H3>重定向</H3>
<P style="text-indent: 0.8cm;">Unix 
命令默认从标准输入设备(stdin)获取输入，将结果输出到标准输出设备(stdout)显示。一般情况下，标准输入设备就是键盘，标准输出设备就是终端，即显示器 
</P>
<H4>输出重定向</H4>
<PRE class="brush: bash;">命令的输出不仅可以是显示器，还可以很容易的转移向到文件，这被称为输出重定向。

命令输出重定向的语法为：

    $ command &gt; file

这样，输出到显示器的内容就可以被重定向到文件。

例如，下面的命令在显示器上不会看到任何输出：

    $ who &gt; users

打开 users 文件，可以看到下面的内容：

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

输出重定向会覆盖文件内容，请看下面的例子：

$ echo line 1 &gt; users
$ cat users
line 1
$

如果不希望文件内容被覆盖，可以使用 &gt;&gt; 追加到文件末尾，例如：

$ echo line 2 &gt;&gt; users
$ cat users
line 1
line 2
$
</PRE>
<H4>输入重定向</H4>
<PRE class="brush: bash;">和输出重定向一样，Unix 命令也可以从文件获取输入，语法为：

    command &lt; file

这样，本来需要从键盘获取输入的命令会转移到文件读取内容。

注意：输出重定向是大于号(&gt;)，输入重定向是小于号(&lt;)。

例如，计算 users 文件中的行数，可以使用下面的命令：

$ wc -l users
2 users
$

也可以将输入重定向到 users 文件：

$ wc -l &lt; users
2
$

注意：上面两个例子的结果不同：第一个例子，会输出文件名；第二个不会，因为它仅仅知道从标准输入读取内容
</PRE>
<H3>重定向深入讲解</H3>
<P style="text-indent: 0.8cm;">一般情况下，每个 Unix/Linux 命令运行时都会打开三个文件： </P>
<UL>
  <LI>标准输入文件(stdin)：stdin的文件描述符为0，Unix程序默认从stdin读取数据。</LI>
  <LI>标准输出文件(stdout)：stdout 的文件描述符为1，Unix程序默认向stdout输出数据。</LI>
  <LI>标准错误文件(stderr)：stderr的文件描述符为2，Unix程序会向stderr流中写入错误信息。</LI></UL>
<H4>使用实例</H4>
<PRE class="brush: bash;">默认情况下，command &gt; file 将 stdout 重定向到 file，command &lt; file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file，可以这样写：

    $command 2 &gt; file

如果希望 stderr 追加到 file 文件末尾，可以这样写：

    $command 2 &gt;&gt; file

2 表示标准错误文件(stderr)。

如果希望将 stdout 和 stderr 合并后重定向到 file，可以这样写：

    $command &gt; file 2&gt;&amp;1

或

    $command &gt;&gt; file 2&gt;&amp;1

如果希望对 stdin 和 stdout 都重定向，可以这样写：

复制纯文本新窗口

    $command &lt; file1 &gt;file2

command 命令将 stdin 重定向到 file1，将 stdout 重定向到 file2。 
</PRE>
<TABLE>
  <CAPTION>  全部可用的重定向命令列表</CAPTION>
  <TBODY>
  <TR>
    <TH style="width: 129px;">      命令</TH>
    <TH style="width: 409px;">      说明</TH></TR>
  <TR>
    <TD>command &gt; file</TD>
    <TD>将输出重定向到 file。</TD></TR>
  <TR>
    <TD>command &lt; file</TD>
    <TD>将输入重定向到 file。</TD></TR>
  <TR>
    <TD>command &gt;&gt; file</TD>
    <TD>将输出以追加的方式重定向到 file。</TD></TR>
  <TR>
    <TD>n &gt; file</TD>
    <TD>将文件描述符为 n 的文件重定向到 file。</TD></TR>
  <TR>
    <TD>n &gt;&gt; file</TD>
    <TD>将文件描述符为 n 的文件以追加的方式重定向到 file。</TD></TR>
  <TR>
    <TD>n &gt;&amp; m</TD>
    <TD>将输出文件 m 和 n 合并。</TD></TR>
  <TR>
    <TD>n &lt;&amp; m</TD>
    <TD>将输入文件 m 和 n 合并。</TD></TR>
  <TR>
    <TD>&lt;&lt; tag</TD>
    <TD>将开始标记 tag 和结束标记 tag 之间的内容作为输入。</TD></TR></TBODY></TABLE>
<H3>Here Document</H3>
<PRE class="brush: bash;">


Here Document 目前没有统一的翻译，这里暂译为”嵌入文档“。Here Document 是 Shell 中的一种特殊的重定向方式，它的基本的形式如下：

    command &lt;&lt; delimiter
        document
    delimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

注意：

    结尾的delimiter 一定要顶格写，前面不能有任何字符，后面也不能有任何字符，包括空格和 tab 缩进。
    开始的delimiter前后的空格会被忽略掉。


下面的例子，通过 wc -l 命令计算 document 的行数：

$wc -l &lt;&lt; EOF
    This is a simple lookup program
    for good (and bad) restaurants
    in Cape Town.
EOF
3
$

也可以 将 Here Document 用在脚本中，例如：

    #!/bin/bash
    cat &lt;&lt; EOF
    This is a simple lookup program
    for good (and bad) restaurants
    in Cape Town.
    EOF

运行结果：

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.


下面的脚本通过 vi 编辑器将 document 保存到 test.txt 文件：

    #!/bin/sh
    filename=test.txt
    vi $filename &lt;&lt; EndOfCommands
    i
    This file was created automatically from
    a shell script
    ^[
    ZZ
    EndOfCommands

运行脚本：

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

打开 test.txt，可以看到下面的内容：

$ cat test.txt
This file was created automatically from
a shell script
$



</PRE>
<H3>/dev/null 文件</H3>
<PRE class="brush: bash;">如果希望执行某个命令，但又不希望在屏幕上显示输出结果，那么可以将输出重定向到 /dev/null：

    $ command &gt; /dev/null

/dev/null 是一个特殊的文件，写入到它的内容都会被丢弃；如果尝试从该文件读取内容，那么什么也读不到。但是 /dev/null 文件非常有用，将命令的输出重定向到它，会起到”禁止输出“的效果。

如果希望屏蔽 stdout 和 stderr，可以这样写：

    $ command &gt; /dev/null 2&gt;&amp;1
</PRE>
<H3>Shell文件包含</H3>
<PRE class="brush: bash;">像其他语言一样，Shell 也可以包含外部脚本，将外部脚本的内容合并到当前脚本。

Shell 中包含脚本可以使用：

    . filename

或

    source filename

两种方式的效果相同，简单起见，一般使用点号(.)，但是注意点号(.)和文件名中间有一空格。

例如，创建两个脚本，一个是被调用脚本 subscript.sh，内容如下：

    url="http://see.xidian.edu.cn/cpp/view/2738.html"

一个是主文件 main.sh，内容如下：

复制纯文本新窗口

    #!/bin/bash
    . ./subscript.sh
    echo $url

执行脚本：

$chomd +x main.sh
./main.sh
http://see.xidian.edu.cn/cpp/view/2738.html
$

注意：被包含脚本不需要有执行权限。 
</PRE>
<HR style="border-width: 2px; border-color: lime;">

<DIV align="center">©copyright 版权所有   作者：zzy</DIV>
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shCore.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushJava.js" type="text/javascript"></SCRIPT>
	
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushJScript.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushXml.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushSql.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/syntaxhighlighter/scripts/shBrushBash.js" type="text/javascript"></SCRIPT>
	
<SCRIPT src="../../pub/syntaxhighlighter/init.js" type="text/javascript"></SCRIPT>
 
<SCRIPT src="../../pub/js/jquery.tools.min.js" type="text/javascript"></SCRIPT>
 <!-- make all links with the 'rel' attribute open overlays --> 
<SCRIPT>
  $(function() {
      $("#apple img[rel]").overlay({effect: 'apple'});
    });
</SCRIPT>
 </DIV></BODY></HTML>
